package exrefelect;

import java.beans.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author: knowno
 * @create: 2025-09-17 17:05
 * @Version 1.0
 **/
public class TestIntro {
    public static void main(String[] args) throws IntrospectionException, InstantiationException, IllegalAccessException, InvocationTargetException {
        //通过调用Introspector的getBeanInfo方法,可以获取到该类的BeanInfo对象
        //通过BeanInfo对象,可以获取到该类的所有属性
        BeanInfo beanInfo = Introspector.getBeanInfo(Student.class);

        Student student = Student.class.newInstance();

        //BeanInfo
        BeanDescriptor beanDescriptor = beanInfo.getBeanDescriptor();
        System.out.println(beanDescriptor);
        //获取 PropertyDescriptor
        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
        for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
            //class  =>Object
            // name  =>setName

            System.out.println(propertyDescriptor.getName());
//            方法 getReadMethod()
//            获取应该用于读取属性值的方法。
//            方法 getWriteMethod()
//            获取应用于写入属性值的方法。
//            setName
            Method writeMethod = propertyDescriptor.getWriteMethod();
            if (writeMethod !=null) {
                System.out.println(writeMethod.getName());

                //调用writeMethod方法,设置属性值

                writeMethod.invoke(student,"张三");
            }


        }

    }
}

class Student extends Object{

    //getter 和setter
    //该类没有属性,根据内省机制,setter方法的参数名,会被自动识别为属性名
    //会有一个name的属性
    public void setName(String name) {
        System.out.println("setName");
    }

}
